package com.itbaizhan;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;

/*Cookie对象的特点
Cookie使用字符串存储数据
Cookie使用Key与Value结构存储数据
单个Cookie存储数据大小限制在4097个字节
Cookie存储的数据中不支持中文，Servlet4.0中支持
Cookie是与域名绑定所以不支持跨一级域名访问
Cookie对象保存在客户端浏览器内存或系统磁盘中
Cookie分为持久化Cooke与状态Cookie
浏览器在保存同一域名所返回Cookie的数量是有限的。不同浏览器支持的数量不同，Chrome浏览器为50个
浏览器每次请求时都会把与当前访问的域名相关的Cookie在请求中提交到服务端。
*/
/*
* Cookie cookie = new Cookie("key","value")
通过new关键字创建Cookie对象
response.addCookie(cookie)
通过HttpServletResponse对象将Cookie写回给客户端浏览器。*/

/*解决Cookie不支持中文
在Cookie中name的值不能使用中文，Value是可以的。
但是在Servlet4.0版本之前Cookie中的Value也是不支持中文存储的，
如果存储的数据中含有中文，代码会直接出现异常。我们可以通过对含有中文的数据
重新进行编码来解决该问题。在Servlet4.0中的Cookie的Value开始支持中文
存储。

java.lang.IllegalArgumentException: Control character in
cookie value or attribute.

URLEncoder.encode("content","code")
将内容按照指定的编码方式做URL编码处理。（创建cookie时写）

URLDecoder.decode("content","code")
将内容按照指定的编码方式做URL解码处理。(获得cookie时写)*/
public class CreateCookieServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建cookie对象
        Cookie cookie1 = new Cookie("key1","Itbz");
        //在Servlet4.0  支持中文
        // Cookie cookie2 = new Cookie("key2","努力学习");

        //在Servlet4.0之前，不支持中文，要做URL编码处理
        //一般情况下做编码处理，无论是不是Servlet 4.0版本
        // URLEncoder.encode("content","code")
        Cookie cookie2 = new Cookie(URLEncoder.encode("尚学堂","utf-8"),URLEncoder.encode("百战","utf-8"));

        //指定失效时间，一旦指定失效时间，那么该Cookie则为持久化cookie
        cookie1.setMaxAge(60);
        cookie2.setMaxAge(120);
        //将cookie写回给客户
        resp.addCookie(cookie1);
        resp.addCookie(cookie2);

        //在浏览器产生响应
        PrintWriter pw = resp.getWriter();
        pw.println("Creat Cookie");
        pw.flush();
        pw.close();
    }
}
/*Cookie跨域问题  （一张会员卡，不支持不同的餐厅用，但支持同一餐厅下的分店使用）
域名分类：域名分为顶级域、顶级域名(一级域名)、二级域名。
域名等级的区别：一级域名比二级域名更高级，二级域名是依附于一级域名之下的附属分区域名，
即二级域名是一级域名的细化分级。例如：baidu.com 为一级域名，news.baidu.com为二级域名。

Cookie不支持一级域名的跨域，支持二级域名的跨域。*/

/*状态Cookie与持久化Cookie
状态Cookie：Cookie对象仅会被缓存在浏览器所在的内存中。当浏览器关闭后
Cookie对象 也会被销毁。

持久化Cookie：浏览器会对Cookie做持久化处理，基于文件形式保存在系统的指定
目录中。在Windows10系统中为了安全问题不会显示Cookie中的内容。

当Cookie对象创建后默认为状态Cookie。可以使用Cookie对象下的cookie.
setMaxAge(60)方法设置失效时间，单位为秒。一旦设置了失效时间，
那么该Cookie为持久化Cookie，浏览器会将Cookie对象持久化到磁盘中。
当失效时间到达后文件删除。*/

/*Cookie总结
Cookie对于存储内容是基于明文的方式存储的，所以安全性很低。
不要在Cookie中存放敏感数据。在数据存储时，
虽然在Servlet4.0中Cookie支持中文，
但是建议对Cookie中存放的内容做编码处理，也可提高安全性。*/